
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>函数式编程Functional - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>函数式编程Functional - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在Java 8之前，Guava定义了哪四个核心函数式接口，它们各自的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Guava定义了四个核心函数式接口：1. Function<F, T>：接收一个输入，产生一个输出。2. Predicate<T>：接收一个输入，产生一个布尔值。3. Supplier<T>：不接收输入，但提供一个值。4. Consumer<T>：接收一个输入，不返回结果。</div>
          </div>
          <div class="card-source">来源: 1.1 核心函数式接口</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Guava的`Lists.transform`方法是如何实现集合转换的？它会立即创建一个包含所有转换后元素的新列表吗？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">不会。`Lists.transform`采用了视图模式（View Pattern），它返回的是原列表的一个视图，而不是一个全新的列表副本。元素只在被访问时（例如通过`get(index)`）才进行转换计算，这种机制被称为懒计算（Lazy Computation），可以有效节省内存和计算资源。</div>
          </div>
          <div class="card-source">来源: 2.1 集合转换功能实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">Guava的`FluentIterable`类是如何实现流畅的链式API的？它主要运用了什么设计模式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`FluentIterable`主要运用了建造者模式（Builder Pattern）。它的每个转换方法（如`transform`、`filter`）都会返回一个新的`FluentIterable`实例，这使得方法链（method chaining）成为可能。所有中间操作都是惰性的，只有在调用终端操作（如`toList()`）时才会触发实际计算。</div>
          </div>
          <div class="card-source">来源: 3.1 FluentIterable核心设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Guava的`Functions.compose(f, g)`方法的作用是什么？它的执行顺序是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`Functions.compose(f, g)`方法用于实现函数组合，它将两个函数`f`和`g`组合成一个新函数。当对输入`x`应用这个新函数时，它会执行`f(g(x))`。也就是说，先将输入`x`应用于函数`g`，然后将`g(x)`的结果作为输入应用于函数`f`。</div>
          </div>
          <div class="card-source">来源: 4.1 函数组合实现分析</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">根据文档，使用Guava的函数式API时，对于有副作用（side effects）的操作，最佳实践是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">最佳实践是应尽量避免在函数式操作（如`filter`或`transform`）的函数中引入副作用。推荐的做法是：首先使用纯函数完成所有的过滤和转换操作，得到一个最终的结果集合；然后，再对这个结果集合进行遍历，以单独处理需要副作用的操作。</div>
          </div>
          <div class="card-source">来源: 6.2 最佳实践与注意事项</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Guava的`Predicates`工具类提供了哪些方法来支持复杂的逻辑判断组合？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`Predicates`工具类提供了`and()`、`or()`和`not()`等静态方法。这些方法允许将多个`Predicate`实例进行逻辑组合（与、或、非），从而构建出复杂的判断条件。其实现还支持短路求值（Short-circuit evaluation），以提高效率。</div>
          </div>
          <div class="card-source">来源: 1.3 Predicates工具类分析</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Guava函数式API中的懒加载（Lazy Loading）和视图（View）实现主要带来了哪些性能和内存上的优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要优势有三点：1. 避免创建中间集合来存储转换或过滤的临时结果。2. 按需计算，只在迭代访问元素时才执行相应的转换或判断操作。3. 显著节省内存，特别是处理非常大的集合时，因为不需要在内存中一次性创建和存储所有结果。</div>
          </div>
          <div class="card-source">来源: 5.1 懒加载与视图实现分析</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在处理长链式调用时，文档推荐了什么方法来提高`FluentIterable`代码的可读性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档推荐避免过长的链式调用。为了提高可读性，应当将一个长链拆分成多个有意义的中间步骤，并将每一步的结果赋给一个有明确名称的中间变量。例如，先过滤并赋值给`filtered`变量，再对`filtered`变量进行转换。</div>
          </div>
          <div class="card-source">来源: 6.2 最佳实践与注意事项</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">`Lists.transform`方法在实现上如何针对不同类型的List进行性能优化？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该方法会检查输入的列表`fromList`是否实现了`RandomAccess`接口。如果实现了，它会返回一个`TransformingRandomAccessList`实例，该实例针对随机访问（通过索引`get`）进行了优化。否则，它会返回一个`TransformingSequentialList`实例，该实例更适合顺序迭代访问。</div>
          </div>
          <div class="card-source">来源: 2.1 集合转换功能实现</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
